package com.amado.course42Nio.demo1;

/**
 * @author wujunwei
 */
public class BitUtils {

  protected BitUtils() {
  }

  /**
   * 判断是否只有1位是1
   * @param value
   * @return
   */
  public static boolean checkIsOnlyOne(int value) {
    return ((value & (value - 1)) == 0);
  }

  /**
   * 判断位值是否存在
   * @param bitValue
   * @param value
   * @return
   */
  public static boolean checkBitValueExist(int value, int bitValue) {
    return (value & bitValue) > 0;
  }

  /**
   * 添加位值
   * @param value
   * @param bitValue
   * @return
   */
  public static int addBitValue(int value, int bitValue) {
    return value | bitValue;
  }

  /**
   * 减去位值
   * @param value
   * @param bitValue
   * @return
   */
  public static int subtractBitValue(int value, int bitValue) {
    if (checkBitValueExist(value, bitValue)) {
      return value - bitValue;
    } else {
      return value;
    }
  }

  /**
   * @author zhuguidong
   *   获取 整数 num 的第 i 位的值
   * @since 2019/4/4 10:13
   */
  public static boolean getBitNumValue(int num, int i) {
    //true 表示第i位为1,否则为0
    return ((num & (1 << i)) != 0);
  }

  /**
   * 判断位值是否存在
   * @param bitValue
   * @param value
   * @return
   */
  public static int initBitMap(int value, int bitValue) {
    for (int l = 0; l < bitValue; l++) {
      value = addBitValue(value, 1 << l);
    }
    return value;
  }
  
  /**
  * @author limingcheng
  * @Description 获取设置第i位的掩码
  * @Date 2020-4-14 19:29
  * @Param [pos]
  * @return int
  **/
  public static  int getMask(int pos){
    return (int) Math.pow(2,pos - 1);
  }

  /**
  * @author limingcheng
  * @Description 设置从最右起第i位的bit为1
  * @Date 2020-4-14 19:32
  * @Param [value, pos]
  * @return int
  **/
  public static int setBit(int value,int pos){
   return value | getMask(pos);
  }

  /**
  * @author limingcheng
  * @Description 设置从最右起第i位的bit为0
  * @Date 2020-4-14 19:33
  * @Param [value, pos]
  * @return int
  **/
  public static int cancelBit(int value,int pos){
    return value & ~getMask(pos);
  }

  public static void main(String[] args) {
    System.out.println(getMask(6));
    System.out.println(setBit(0, 16));
    System.out.println(cancelBit(6, 3));
  }

}
